#列表
import copy
from os import remove

a = list()
a = []
list1 = ['abc','def']
list1.append('ghi')
print(list1)

#切片技术
a = [1,2,3,4]
print(a[-2:-1])#[3]
#取逆
a[::-1]
print(a)
print(a[::-1])
a.reverse()#把a改变了
print(a)
print(list(reversed(a)))

a = [5,3,2,1,4]
a.sort()#直接修改原列表
print(a)#[1, 2, 3, 4, 5]

b = [5,3,2,1,4]
c = sorted(b)#不修改原对象
print(b)#[5,3,2,1,4]

#列表推导式
#筛选出0~9之间的奇数，再对每个奇数做立方运算，得到一个列表
d = [k**3 for k in range(9) if k%2 == 1]
print(d)

#删除列表元素
import random
#生成6个1~15之间的随机整数
a = [random.randint(1,15) for _ in range(6)]
print(a)#[13, 14, 11, 14, 3, 11]
del a[2]
print(a)#[13, 14, 14, 3, 11]
a.pop()#不带参数，默认删除最右边
print(a)#[13, 14, 14, 3]
a.pop(0)
print(a)#[14, 14, 3]

a = [1,2]
b = [3,4]
a+=b
print(a)#[1, 2, 3, 4]
a = [1,2]
b = [3,4]
a.extend(b)
print(a)#[1, 2, 3, 4]
a.append(10)
print(a)#[1, 2, 3, 4, 10]

x = [1,1,2,3,1]
print(x.count(1))#数x中有几个1  #3

#元组
a = ()
a = tuple()
a = 1,2,3
a = (1,2,3)

#序列解包
x,y,z = 1,2,3
x,y = y,x
print(x,y,z)

a = [3,1,4]
print(a)#[3, 1, 4]
print(*a)#3 1 4

b = [(1,2,3),(4,5,6),(7,8,9)]
#访问6
print(b[1][2])
print(b[1][-1])
print(b[-2][-1])

a = [1,2,3]
b = [4,5,6]
c = zip(a,b)
print(list(c))#[(1, 4), (2, 5), (3, 6)]

a1 ,b1 = zip(*zip(a,b))
print(a1)#(1, 2, 3)
print(b1)#(4, 5, 6)

b=[(1,2,3),(4,5,6,),(7,8,9)]
#zip拉链函数【元素配对】
#给b转置
print(list(zip(*b)))#[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

#map(参数1，参数2)
#参数1：一个函数；参数2：可迭代对象（有顺序的存储）（如，列表，元组）
a = [2,3,4]
ret = map(lambda x : x**2 , a)
print(list(ret))#[4, 9, 16]

#index()用于查找某个元素在序列中第一次出现的【索引】位置
c = ['zhangsan','lisi']
for k in c:
    print('第',c.index(k)+1,'名',k)
#enumerate()用于在遍历序列时【同时获取索引和值】
for ind,v in enumerate(c):
    print('第',ind+1,'名',v)

#深浅拷贝
#赋值，不是拷贝
a = [1,2,3]
b = a#让 b 指向 a 的同一个内存地址，没有创建新对象。
print(id(a)==id(b))#True

#浅拷贝
#浅拷贝会创建一个新的列表对象
b = a[::]
print(id(a)==id(b))#False

a = [1,2,[3,4]]
b = a.copy()
a[2][0]=33#如果列表包含 嵌套的可变对象（如子列表、字典），修改嵌套部分会影响原列表。
a[0]=10
print(a,b)#[10, 2, [33, 4]] [1, 2, [33, 4]]
print(id(a)==id(b))#False


#深拷贝
#深拷贝会递归复制所有嵌套对象，完全独立于原对象。即使修改 a 的嵌套部分，b 也不会受影响。
a = [1,2,3,4]
b = copy.deepcopy(a)
a[2]=33
print(a,b)#[1, 2, 33, 4] [1, 2, 3, 4]
print(id(a)==id(b))#False

#这种情况，浅拷贝和深拷贝一样
#一维列表（没有嵌套结构），浅拷贝和深拷贝效果相同
#浅拷贝 a.copy() 已经足够，修改 a 不会影响 b
a=[1,2,3,4]
b=a.copy()
a[0]=11
print(a,b)#[11, 2, 3, 4] [1, 2, 3, 4]

#排序
a = [random.randint(3,10) for _ in range(6)]
b = sorted(a,reverse = True)#降序
c = sorted(a,reverse = False)#升序
print(b,c)#[10, 8, 7, 6, 4, 3] [3, 4, 6, 7, 8, 10]

#水仙花数
def func1(x):
    b,s,g = map(int,str(x))
    return b**3+s**3+g**3 == x
r = filter(func1,range(100,1000))
print(list(r))#[153, 370, 371, 407]

#filter(a,b)过滤器
#a:判断函数 b:可迭代对象

#字典
#字典的特点
#1.可变的（不可哈希）
#2.键必须是可哈希的（即只能取数、字符串、元组）
#3.无序的，不支持切片，不支持双向索引c[0]X;c[::]X
#4.支持键的索引c['a'],c['b']
a = {}
b = dict()
c = {'a':97,'b':99}#'a'是键(key)；97是值(value)
print(c.get('a'))#97
c['c']=c.get('c',100)#添加键
print(c)#{'a': 97, 'b': 99, 'c': 100}

#显示所有的键
c.keys()
for k in c.keys():
    print(k)

#显示所有的值
c.values()
for k in c.values():
    print(k)

#显示所有的键值对，每个键值对是一个元组
c.items()
for k,v in c.items():
    print(k,':',v)
#a : 97
#b : 99
#c : 100

#字符串
#一个汉字占用三个字节。
a = 'apple,banana,pear'
b = a.split(',')#把字符串以“，”作为分隔符，分割为一个列表。
print(a)#apple,banana,pear
print(b)#['apple', 'banana', 'pear']

# 删除左边的\n，删除右边的\n，用,用换行符作为分隔符，将字符串分割成列表
b = a.lstrip('\n').rstrip('\n').split('\n')
b = set(b)#将列表 b 转换为集合(set)
print(b)#{'apple,banana,pear'}

a = ['l','o','v','e']
b = ''.join(a)#将序列中的元素以指定的字符连接生成一个新的字符串。
print(b)#love

a = 'banana'
b = a.find('a')#返回第一个找到的下标，没找到返回-1
print(b)#1

#replace() 方法把字符串中的 old（旧字符串） 替换成 new(新字符串)，如果指定第三个参数max，则替换不超过 max 次。
str = 'this is string example...wow!!! this is really good.'
print(str.replace('is','xx',3))#thxx xx string example...wow!!! thxx is really good.

#eval() 函数用来执行一个字符串表达式，并返回表达式的值。
#字符串表达式可以包含变量、函数调用、运算符和其他 Python 语法元素。
#不能含有赋值语句
x = 7
print(eval('3*x'))#21
print(eval('2+3*4'))#14

#exec允许赋值语句
exec('print("hello")')#hello
exec('a=10')
print(a)#10

#文件操作
fp = open('文件名.txt','r',encoding='utf-8')









